package com.rj.ability.leqi.common;

import com.rj.util.AssertBeanUtils;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

/**
 * 乐企平台信息
 *
 * @author YFX_RANLUBO
 * @date 2024/08/09 15:03
 **/
@Data
@Accessors(chain = true)
public class BaseLeqiInfoConfig {
    /**
     * 环境ID
     */
    private String appId;
    /**
     * 乐企访问地址（如：http://219.151.9.13:10010）
     */
    private String baseUrl;
    /**
     * 是否输出报文
     */
    private Boolean outFileSwitch = false;
    /**
     * 报文输出路径
     */
    private String outFilePath;
    /**
     * 是否为沙箱环境
     */
    private Boolean sandbox = true;
    /**
     * 程序调用授权key
     */
    private String key;
    /**
     * 乐企平台企业税号
     */
    private String nsrsbh;
    /**
     * 接入单位平台编号（乐企平台）
     */
    private String jrdwptbh;
    /**
     * 税务机关代码（省）
     */
    private String swjgdm;
    /**
     * 税务机关代码（省）
     */
    private String ip;
    /**
     * 税务机关代码（省）
     */
    private String mac;
    /**
     * 使用单位信息
     */
    private Map<String, BaseUserInfo> syMap = new HashMap<>();
    /**
     * 平台能力(false 开通前测试、true:已开通,null未开通)
     */
    private Map<ApiTypeEnum, Boolean> abilityMap = new HashMap<>();

    /**
     * 默认能力开通测试中
     *
     * @param apiTypeEnum
     * @return
     */
    public BaseLeqiInfoConfig addAbility(ApiTypeEnum apiTypeEnum) {
        abilityMap.put(apiTypeEnum, false);
        return this;
    }

    /**
     * 设置能力及开通情况
     *
     * @param apiTypeEnum
     * @param ktzt        (false:开通前测试true:已开通,null:未开通)
     * @return
     */
    public BaseLeqiInfoConfig addAbility(ApiTypeEnum apiTypeEnum, Boolean ktzt) {
        abilityMap.put(apiTypeEnum, ktzt);
        return this;
    }

    /**
     * 添加使用单位
     *
     * @param sydwptbh 使用单位平台编号
     * @param synsrmc  使用单位名称
     * @param synsrsbh 使用单位税号
     * @param minEd    最小额度
     * @param maxEd    最大额度
     * @param minFpsl  最小发票数量
     * @param maxFpsl  最大发票数量
     * @return
     */
    public BaseLeqiInfoConfig addSyUser(String sydwptbh, String synsrmc, String synsrsbh,
                                        Integer minEd, Integer maxEd, Long minFpsl, Long maxFpsl) {
        BaseUserInfo baseUserInfo = new BaseUserInfo();
        baseUserInfo.setSydwptbh(sydwptbh);
        baseUserInfo.setSynsrmc(synsrmc);
        baseUserInfo.setSynsrsbh(synsrsbh);
        baseUserInfo.setMaxEd(maxEd);
        baseUserInfo.setMinEd(minEd);
        baseUserInfo.setMaxFpsl(minFpsl);
        baseUserInfo.setMinFpsl(maxFpsl);
        syMap.put(baseUserInfo.getSynsrsbh(), baseUserInfo);
        return this;
    }

    /**
     * 查找使用单位信息
     *
     * @param nsrsbh
     * @return
     */
    public BaseUserInfo queryBaseUserInfo(String nsrsbh) {
        BaseUserInfo baseUserInfo = syMap.get(nsrsbh);
        AssertBeanUtils.ASSERTOR_BEAN.isTrue(baseUserInfo == null, "未找到税号为{}的使用单位信息", nsrsbh);
        return baseUserInfo;
    }

    /**
     * 查询配置的平台能力
     *
     * @param apiTypeEnum
     * @return
     */
    public ApiTypeEnum queryAbility(ApiTypeEnum apiTypeEnum) {
        queryAbilityZt(apiTypeEnum);
        return apiTypeEnum;
    }

    /**
     * 查询配置的平台能力状态
     *
     * @param apiTypeEnum
     * @return
     */
    public boolean queryAbilityZt(ApiTypeEnum apiTypeEnum) {
        Boolean has = abilityMap.get(apiTypeEnum);
        AssertBeanUtils.ASSERTOR_BEAN.isTrue(has == null, "{}能力暂不支持", apiTypeEnum.getName());
        return has;
    }
}
